home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Free Software Collection 6
/
FM Towns Free Software Collection 6.iso
/
t_os
/
igo
/
src
/
igo_oper.c
< prev
next >
Wrap
C/C++ Source or Header
|
1993-07-08
|
16KB
|
586 lines
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <winb.h>
#include <te.h>
#include <fntb.h>
#include <gui.h>
#include <file_dlg.h>
#include <time.h>
#include "igo.h"
#include "ban19.h"
#include "kiffile.h"
extern int dialogId_handy ;
extern int dialogId_title ;
extern int auto_dialogId ;
extern int backId ;
extern int deskTopId ;
extern int buttonId ;
extern int blacknameId ;
extern int whitenameId ;
extern int numboxId[12] ;
extern int dbId[2] ;
extern int placeId ;
extern int listMenuId[3] ;
extern int textcommentId[8] ;
extern int title_dispdialogId ;
extern int warningId;
extern int commentdialogId;
extern int commentId;
static char save_fname[84] = "";
YMDHM *kifu_playstart_time_read();
YMDHM *kifu_playend_time_read();
/* initDataMIDESK:buttonId:MJ_BUTTONL40の呼び出し関数 */
int igo_oper(kobj, messId, argc, pev, trigger)
int kobj ;
int messId ;
int argc ;
EVENT *pev ;
int trigger ;
{
int banx1, bany1, banx2, bany2, ishi_r, ishi_2r;
int stonex=0;
int stoney=0;
int ichi;
static int waittime = 20;
static short int dx, dy;
static short int shift;
banx1 = BANX;
bany1 = BANY;
ishi_r = ISHI_R;
ishi_2r = ishi_r * 2;
banx2 = banx1 + (19+1)*ishi_2r;
bany2 = bany1 + (19+1)*ishi_2r;
if(pev->what == EVMOSDN){
dx = *((short *)&(pev->info));
dy = *(((short *)&(pev->info)) + 1);
shift = pev->shift;
waittime = 20;
}
if(banx1 < dx && dx < banx2 && bany1 < dy && dy < bany2){
if(shift & SLEFTBTN){
stonex = ((dx-(BANX+ISHI_R)) / (ISHI_R*2));
stoney = ((dy-(BANY+ISHI_R)) / (ISHI_R*2));
ichi=(stonex+1) + (stoney+1)*20;
if(kifu_put(ichi)!=0){
;
}
comment_dispFunc();
}else{
kifu_cancel();
comment_dispFunc();
}
}else{
if(shift & SLEFTBTN){
kifu_forward();
comment_dispFunc();
wait(waittime);
waittime *= 0.75;
}else{
kifu_back();
comment_dispFunc();
wait(waittime);
waittime *= 0.75;
}
}
return NOERR ;
}
/* initDataMIDESK:mitem1Id[0]:MJ_MITEML40の呼び出し関数 */
int igo_init(kobj, messId, argc, pev, trigger)
int kobj ;
int messId ;
int argc ;
EVENT *pev ;
int trigger ;
{
strcpy( save_fname, "");
kifu_init();
comment_dispFunc();
title_dispclearFunc();
return NOERR ;
}
/* initDataMIDESK:mitem1Id[1]:MJ_MITEML40の呼び出し関数 */
int igo_read(kobj, messId, argc, pev, trigger)
int kobj ;
int messId ;
int argc ;
EVENT *pev ;
int trigger ;
{
char fileName[80] ; /* ファイル名用の配列 */
int cell_id;
/* ファイルダイアログで"取消"が押されたらこれ以下を実行しない */
if( fdlgFunc( fileName ) != 0 )
{
kifu_init();
if(kifu_read(fileName) != 0){
/* オブジェクトをダイアログに取り付ける */
MMI_SendMessage( warningId , MM_ATTACH , 1 , backId ) ;
/* warningIdで示されるオブジェクトを表示する */
MMI_SendMessage( warningId , MM_SHOW , 0 ) ;
return NOERR;
}
strcpy(save_fname, fileName);
kifu_first();
do{
cell_id = kifu_forward();
}while( cell_id != HEAD_CELL && cell_id != REPEAT_CANNOT_BOTTOM_CELL);
if( cell_id == HEAD_CELL){
kifu_back();
}
comment_dispFunc();
}
title_dispFunc();
return NOERR ;
}
/* initDataMIDESK:mitem1Id[2]:MJ_MITEML40の呼び出し関数 */
int igo_write(kobj, messId, argc, pev, trigger)
int kobj ;
int messId ;
int argc ;
EVENT *pev ;
int trigger ;
{
char fileName[84] ; /* ファイル名用の配列 */
char wk_fname[80] ; /* ファイル名用の配列 */
/* ファイルダイアログで"取消"が押されたらこれ以下を実行しない */
if( fdlgFunc( wk_fname ) != 0 )
{
strcat(wk_fname, ".kif");
strcpy(fileName, wk_fname);
if(kifu_write(fileName) != 0){
/* オブジェクトをダイアログに取り付ける */
MMI_SendMessage( warningId , MM_ATTACH , 1 , backId ) ;
/* warningIdで示されるオブジェクトを表示する */
MMI_SendMessage( warningId , MM_SHOW , 0 ) ;
return NOERR;
}
strcpy(save_fname, fileName);
}
return NOERR ;
}
/* initDataMIDESK:mitem1Id[4]:MJ_MITEML40の呼び出し関数 */
int igo_handy(kobj, messId, argc, pev, trigger)
int kobj ;
int messId ;
int argc ;
EVENT *pev ;
int trigger ;
{
/* よくないけど応急処置 */
strcpy( save_fname, "");
/* オブジェクトをダイアログに取り付ける */
MMI_SendMessage( dialogId_handy , MM_ATTACH , 1 , backId ) ;
/* dialogId_handyでされるオブジェクトを表示する */
MMI_SendMessage( dialogId_handy , MM_SHOW , 0 ) ;
/* オブジェクトをダイアログから取り外す */
MMI_SendMessage( deskTopId , MM_DETACH , 0 ) ;
MMI_SendMessage( buttonId , MM_DETACH , 0 ) ;
return NOERR ;
}
/* initDataMIDESK:mitem1Id[3]:MJ_MITEML40の呼び出し関数 */
int igo_samewrite(kobj, messId, argc, pev, trigger)
int kobj ;
int messId ;
int argc ;
EVENT *pev ;
int trigger ;
{
if(strlen(save_fname) != 0){
if(kifu_write(save_fname) != 0){
;
}
}
return NOERR ;
}
/* initDataMIDESK:mitem2Id[0]:MJ_MITEML40の呼び出し関数 */
int igo_title(kobj, messId, argc, pev, trigger)
int kobj ;
int messId ;
int argc ;
EVENT *pev ;
int trigger ;
{
char tptr[21];
YMDHM *ymdhm;
time_t *timer;
int i, j, k, l;
struct tm *current_time;
static char *listString1[] = { "黒コミ出し", "白コミ出し", "コミなし" } ;
static char *listString2[] = { "半", "ちょうど" } ;
static char *listString3[] = { "黒勝ち", "白勝ち", "引き分け" } ;
/* オブジェクトをダイアログに取り付ける */
MMI_SendMessage( dialogId_title , MM_ATTACH , 1 , backId ) ;
/* 値を設定する */
kifu_blacknameread( tptr);
MMI_SendMessage( blacknameId, MM_SETTEXT, 3, tptr, 21, FALSE);
kifu_whitenameread( tptr);
MMI_SendMessage( whitenameId, MM_SETTEXT, 3, tptr, 21, FALSE);
kifu_playspaceread( tptr);
MMI_SendMessage( placeId, MM_SETTEXT, 3, tptr, 21, FALSE);
/* 日付時刻を設定する */
time(timer);
current_time = localtime(timer);
ymdhm = kifu_playstart_time_read();
if(ymdhm->year== 0){
ymdhm->year = 1900 + current_time->tm_year;
}
if(ymdhm->month== 0){
ymdhm->month = 1 + current_time->tm_mon;
}
if(ymdhm->day == 0){
ymdhm->day = current_time->tm_mday;
}
MMI_SendMessage( numboxId[0], MM_SETNUMBOX, 5, ymdhm->year, 0, 9999, 1, 0);
MMI_SendMessage( numboxId[1], MM_SETNUMBOX, 5, ymdhm->month, 1, 12, 1, 0);
MMI_SendMessage( numboxId[2], MM_SETNUMBOX, 5, ymdhm->day, 1, 31, 1, 0);
MMI_SendMessage( numboxId[3], MM_SETNUMBOX, 5, ymdhm->hour, 0, 23, 1, 0);
MMI_SendMessage( numboxId[4], MM_SETNUMBOX, 5, ymdhm->minute, 0, 59, 1, 0);
ymdhm = kifu_playend_time_read();
if(ymdhm->year== 0){
ymdhm->year = 1900 + current_time->tm_year;
}
if(ymdhm->month== 0){
ymdhm->month = 1 + current_time->tm_mon;
}
if(ymdhm->day == 0){
ymdhm->day = current_time->tm_mday;
}
MMI_SendMessage( numboxId[5], MM_SETNUMBOX, 5, ymdhm->year, 0, 9999, 1, 0);
MMI_SendMessage( numboxId[6], MM_SETNUMBOX, 5, ymdhm->month, 1, 12, 1, 0);
MMI_SendMessage( numboxId[7], MM_SETNUMBOX, 5, ymdhm->day, 1, 31, 1, 0);
MMI_SendMessage( numboxId[8], MM_SETNUMBOX, 5, ymdhm->hour, 0, 23, 1, 0);
MMI_SendMessage( numboxId[9], MM_SETNUMBOX, 5, ymdhm->minute, 0, 59, 1, 0);
kifu_komiread(&j, &k, &l);
/* リストメニューの設定をします。 */
MMI_SendMessage(listMenuId[0], MM_SETMAXROWCOLUM, 2, 3, 11) ;
MMI_SendMessage(listMenuId[0], MM_SETCOLUMLEN, 2, 0, 11) ;
for (i = 0 ; i < sizeof(listString1)/sizeof(char *) ; i++)
MMI_SendMessage(listMenuId[0], MM_SETROWCOLUM, 3, i, 0, listString1[i]) ;
if(j== -1){
j = 0;
}
/* リストメニューの先頭の項目を選択状態とします。 */
MMI_SendMessage(listMenuId[0], MM_SETROWCOLUM, 4,
j, 0, listString1[j], TRUE) ;
if(k== -1){
k = 5;
}
MMI_SendMessage( numboxId[10], MM_SETNUMBOX, 5, k, 0, 9999, 1, 0);
/* リストメニューの設定をします。 */
MMI_SendMessage(listMenuId[1], MM_SETMAXROWCOLUM, 2, 2, 9) ;
MMI_SendMessage(listMenuId[1], MM_SETCOLUMLEN, 2, 0, 9) ;
for (i = 0 ; i < sizeof(listString2)/sizeof(char *) ; i++)
MMI_SendMessage(listMenuId[1], MM_SETROWCOLUM, 3, i, 0, listString2[i]) ;
if(l== -1){
l = 0;
}
/* リストメニューの先頭の項目を選択状態とします。 */
MMI_SendMessage(listMenuId[1], MM_SETROWCOLUM, 4,
l, 0, listString2[l], TRUE) ;
kifu_issueread(&j, &k);
/* リストメニューの設定をします。 */
MMI_SendMessage(listMenuId[2], MM_SETMAXROWCOLUM, 2, 3, 9) ;
MMI_SendMessage(listMenuId[2], MM_SETCOLUMLEN, 2, 0, 9) ;
for (i = 0 ; i < sizeof(listString3)/sizeof(char *) ; i++)
MMI_SendMessage(listMenuId[2], MM_SETROWCOLUM, 3, i, 0, listString3[i]) ;
if(j== -1){
j = 0;
}
/* リストメニューの先頭の項目を選択状態とします。 */
MMI_SendMessage(listMenuId[2], MM_SETROWCOLUM, 4,
j, 0, listString3[j], TRUE) ;
MMI_SendMessage( numboxId[11], MM_SETNUMBOX, 5, k, 0, 9999, 1, 0);
/* dialogId_titleでされるオブジェクトを表示する */
MMI_SendMessage( dialogId_title , MM_SHOW , 0 ) ;
/* オブジェクトをダイアログから取り外す */
MMI_SendMessage( deskTopId , MM_DETACH , 0 ) ;
MMI_SendMessage( buttonId , MM_DETACH , 0 ) ;
return NOERR ;
}
/* initDataMIDESK:mitem2Id[1]:MJ_MITEML40の呼び出し関数 */
int igo_comment(kobj, messId, argc, pev, trigger)
int kobj ;
int messId ;
int argc ;
EVENT *pev ;
int trigger ;
{
MMI_SendMessage( commentId, MM_SETTEXT, 3, kifu_commentread(), 256, FALSE);
/* オブジェクトをダイアログに取り付ける */
MMI_SendMessage( commentdialogId, MM_ATTACH , 1 , backId ) ;
/* commentdialogIdでされるオブジェクトを表示する */
MMI_SendMessage( commentdialogId , MM_SHOW , 0 ) ;
/* オブジェクトをダイアログから取り外す */
MMI_SendMessage( deskTopId , MM_DETACH , 0 ) ;
MMI_SendMessage( buttonId , MM_DETACH , 0 ) ;
return NOERR ;
}
/* initDataMIDESK:mitem2Id[2]:MJ_MITEML40の呼び出し関数 */
int igo_chg_put(kobj, messId, argc, pev, trigger)
int kobj ;
int messId ;
int argc ;
EVENT *pev ;
int trigger ;
{
kifu_chg_put();
comment_dispFunc();
return NOERR ;
}
/* initDataMIDESK:mitem2Id[3]:MJ_MITEML40の呼び出し関数 */
int igo_chg_cancel(kobj, messId, argc, pev, trigger)
int kobj ;
int messId ;
int argc ;
EVENT *pev ;
int trigger ;
{
kifu_chg_cancel();
comment_dispFunc();
return NOERR ;
}
/* initDataMIDESK:mitem2Id[4]:MJ_MITEML40の呼び出し関数 */
int igo_nummberdisp(kobj, messId, argc, pev, trigger)
int kobj ;
int messId ;
int argc ;
EVENT *pev ;
int trigger ;
{
kifu_numberdisp();
comment_dispFunc();
return NOERR ;
}
/* initDataMIDESK:mitem2Id[5]:MJ_MITEML40の呼び出し関数 */
int igo_autorebirth(kobj, messId, argc, pev, trigger)
int kobj ;
int messId ;
int argc ;
EVENT *pev ;
int trigger ;
{
/* オブジェクトをダイアログに取り付ける */
MMI_SendMessage( auto_dialogId , MM_ATTACH , 1 , backId ) ;
/* dialogId_handyでされるオブジェクトを表示する */
MMI_SendMessage( auto_dialogId , MM_SHOW , 0 ) ;
/* オブジェクトをダイアログから取り外す */
MMI_SendMessage( deskTopId , MM_DETACH , 0 ) ;
MMI_SendMessage( buttonId , MM_DETACH , 0 ) ;
return NOERR ;
}
/* ファイルダイアログ処理関数 */
int fdlgFunc( PathName )
char *PathName ;
{
static char *ExtStr[] = {"*.kif" , NULL} ; /* ワイルドカードの指定 */
unsigned int MSlctCnt ; /* 選択されたファイル数(ここでは使っていない) */
int Atr ;
int ret ;
/* ファイルダイアログを表示している間は
メニューを選択できないようにする */
MTL_setAtrObj( deskTopId , MS_INACTIVEL40) ;
MTL_setAtrObj( buttonId , MS_INACTIVEL40) ;
/* ファイルダイアログの表示 */
ret = FDG_DspFileDlg( MMI_GetBaseObj(), FDG_TEXT, NULL, ExtStr, &MSlctCnt ) ;
/* "実行"が押されたならファイル名を取得する */
if( ret )
{
FDG_GetPathName( PathName , &Atr , 0 ) ;
}
/* 選択不可だったものを元に戻す */
MTL_resetAtrObj( deskTopId , (~MS_INACTIVEL40)) ;
MTL_resetAtrObj( buttonId , (~MS_INACTIVEL40)) ;
return ret ;
}
/* 棋譜タイトル表示関数 */
int title_dispFunc()
{
char blackname[21];
char whitename[21];
char play_space[21];
int komi_id, komi_number, hanmoku_id;
int vicdef_id, vicdef_number;
YMDHM *play_start;
YMDHM *play_end;
static char wstr[80], t[80];
kifu_blacknameread( blackname);
kifu_whitenameread( whitename);
play_start = kifu_playstart_time_read();
play_end = kifu_playend_time_read();
kifu_playspaceread( play_space);
kifu_komiread( &komi_id, &komi_number, &hanmoku_id);
kifu_issueread( &vicdef_id, &vicdef_number);
MMI_SendMessage( textcommentId[0], MM_SETTEXT, 3, blackname, 21, FALSE);
MMI_SendMessage( textcommentId[1], MM_SETTEXT, 3, whitename, 21, FALSE);
strcpy(wstr, _itoa(play_start->year, t, 10));
strcat(wstr, "年");
strcat(wstr, _itoa(play_start->month, t, 10));
strcat(wstr, "月");
strcat(wstr, _itoa(play_start->day, t, 10));
strcat(wstr, "日");
strcat(wstr, _itoa(play_start->hour, t, 10));
strcat(wstr, "時");
strcat(wstr, _itoa(play_start->minute, t, 10));
strcat(wstr, "分");
MMI_SendMessage( textcommentId[2], MM_SETTEXT, 3, wstr, 23, FALSE);
strcpy(wstr, _itoa(play_end->year, t, 10));
strcat(wstr, "年");
strcat(wstr, _itoa(play_end->month, t, 10));
strcat(wstr, "月");
strcat(wstr, _itoa(play_end->day, t, 10));
strcat(wstr, "日");
strcat(wstr, _itoa(play_end->hour, t, 10));
strcat(wstr, "時");
strcat(wstr, _itoa(play_end->minute, t, 10));
strcat(wstr, "分");
MMI_SendMessage( textcommentId[3], MM_SETTEXT, 3, wstr, 23, FALSE);
MMI_SendMessage( textcommentId[4], MM_SETTEXT, 3, play_space, 21, FALSE);
switch(komi_id ){
case 0: strcpy(wstr, "黒コミ出し");break;
case 1: strcpy(wstr, "白コミ出し");break;
case 2: strcpy(wstr, "コミなし ");break;
default: strcpy(wstr, " ");break;
}
if(komi_id!=2){
strcat(wstr, _itoa(komi_number, t, 10));
strcat(wstr, "目");
switch(hanmoku_id ){
case 0: strcat(wstr, "半");break;
case 1: strcat(wstr, " ");break;
default:strcat(wstr, " ");break;
}
}
MMI_SendMessage( textcommentId[5], MM_SETTEXT, 3, wstr, 21, FALSE);
switch(vicdef_id ){
case 0: strcpy(wstr, "黒 ");break;
case 1: strcpy(wstr, "白 ");break;
case 2: strcpy(wstr, "ジゴ");break;
default: strcpy(wstr, " ");break;
}
if(vicdef_number==0){
strcat(wstr, "中押し勝ち");
}else{
strcat(wstr, _itoa(vicdef_number, t, 10));
strcat(wstr, "目");
if(hanmoku_id == 0){
strcat(wstr, "半勝ち");
}else if(vicdef_id != 2){
strcat(wstr, "勝ち");
}
}
MMI_SendMessage( textcommentId[6], MM_SETTEXT, 3, wstr, 21, FALSE);
MMI_SendMessage( title_dispdialogId , MM_SHOW , 0 ) ;
return 0;
}
/* 棋譜タイトルクリア関数 */
int title_dispclearFunc()
{
static char wstr[80] = " ";
MMI_SendMessage( textcommentId[0], MM_SETTEXT, 3, wstr, 21, FALSE);
MMI_SendMessage( textcommentId[1], MM_SETTEXT, 3, wstr, 21, FALSE);
MMI_SendMessage( textcommentId[2], MM_SETTEXT, 3, wstr, 23, FALSE);
MMI_SendMessage( textcommentId[3], MM_SETTEXT, 3, wstr, 23, FALSE);
MMI_SendMessage( textcommentId[4], MM_SETTEXT, 3, wstr, 21, FALSE);
MMI_SendMessage( textcommentId[5], MM_SETTEXT, 3, wstr, 21, FALSE);
MMI_SendMessage( textcommentId[6], MM_SETTEXT, 3, wstr, 21, FALSE);
MMI_SendMessage( title_dispdialogId , MM_SHOW , 0 ) ;
return 0;
}
/* コメント出力関数関数 */
int comment_dispFunc()
{
kifu_disp();
MMI_SendMessage( textcommentId[7], MM_SETTEXT, 3, kifu_commentread(), 256, FALSE);
MMI_SendMessage( textcommentId[7] , MM_SHOW , 0 ) ;
return 0;
}